#include <stdio.h>

// int main()
// {
//     char a = 5;
//     //int 4字节 32bit  char 1字节 8bit
//     //00000000000000000000000000000101
//     //截断  00000101
//     char b = 126;
//     //00000000000000000000000001111110
//     //截断  01111110
//     char c =  a + b;
//     //用整型来计算
//     //00000000000000000000000000000101
//     //00000000000000000000000001111110
//     //00000000000000000000000010000011
//     // c 存放 10000011
//     //以整型打印 高位补符号位1
//     //11111111111111111111111110000011
//     //值为 -128 + 3  为-125

//     printf("%d\n",c);
//     return 0;
// }


// //体会整型提升 
// int main()
// {
//     char a = 0xb6;
//     short b = 0xb600;
//     int c = 0xb6000000;
//     if(a==0xb6)
//        printf("a");
//     if(b==0xb600)
//        printf("b");
//     if(c==0xb6000000)
//        printf("c");
//     return 0;
// }




// int main()
// {
//    int i = 1;
//    int ret = (++i) + (++i) + (++i);
//    printf("%d\n", ret);
//    printf("%d\n", i);
//    return 0;
// }



// //小青蛙走台阶的问题 一次可以走一个或两个台阶 n个台阶有几种走法？
// int fib(int n)
// {
//    if(n <= 2)
//       return n;
//    else
//       return fib(n-1)+fib(n-2);
// }
// int main()
// {
//    int n = 0;
//    scanf("%d",&n);
//    int a = fib(n);
//    printf("%d\n",a);
//    return 0;
// }





// //序列中删除指定数字 输入n，在输入n个数字，输入要删除的数字，将删除后的数字序列再一行输入 
// int main()
// {
//    int n = 0;
//    scanf("%d",&n);
//    int arr[n];
//    int i = 0;
//    for(i = 0;i < n;i++ )
//    {
//       scanf("%d",&arr[i]);
//    }
//    int del = 0;
//    scanf("%d",&del);
//    for(i = 0;i < n;i++)
//    {
//       if(arr[i] != del)
//          printf("%d ",arr[i]);
//    }
//    return 0;
// }
// //上述写法仅不打印，若要将新数列存储，则可以用i和j遍历，可创建新数组，也可直接利用旧数组，快慢指针

// int main()
// {
//    int n = 0;
//    scanf("%d",&n);
//    int arr[n];
//    int i = 0;
//    for(i = 0;i < n;i++ )
//    {
//       scanf("%d",&arr[i]);
//    }
//    int del = 0;
//    scanf("%d",&del);
//    int j = 0;
//    for(i = 0;i < n;i++)
//    {
//      if(arr[i] != del)
//         arr[j++] = arr[i];
//         //j++是精髓 省掉一行
//    }
//    for(i = 0;i < j;i++)
//    {
//       printf("%d ",arr[i]);
//    }
//    return 0;
// }





// //输入n个成绩 输出最高分与最低分的差值
// int main()
// {
//    int n = 0;
//    scanf("%d",&n);
//    int arr[n];
//    int i = 0;
//    for(i = 0;i < n;i++ )
//    {
//       scanf("%d",&arr[i]);
//    }
//    int max = 0;
//    int min = 0;
//    max = arr[0];
//    min = arr[0];
//    for(i = 1;i < n;i++)
//    {
//       if(max < arr[i])
//          max = arr[i];
//       if(min > arr[i])
//          min = arr[i];
//    }
//    printf("%d\n",max-min);
// }







// //完成字母大小写的转换 分组输入 每行一个 分组输出 每行一个
// int main()
// {
//    char ch = 0;
//    while(scanf("%c",&ch) == 1)
//    //也可以改成while(scanf("%c",&ch) != EOF)
//    {
//       if(ch >= 'a'&& ch <= 'z')
//          printf("%c\n",ch-32);
//       else
//          printf("%c\n",ch+32);
//    //程序会读入换行\n并输出*号，解决方案有两个
//    //其一是用getchar（）吃掉换行符
//       getchar();
//    //另一种是else也加上条件 当输入的是大写A-Z时才转换
//    }
//    return 0;
// }

// //用库函数可以简化
// #include <ctype.h>
// int main()
// {
//    char ch = 0;
//    while(scanf("%c",&ch) != EOF)
//    {
//       if(islower(ch))
//          printf("%c\n",toupper(ch));
//       else if(isupper(ch))
//          printf("%c\n",tolower(ch));
//    }
//    return 0;
// }






//判断是不是字母
// int main()
// {
//    char ch = 0;
//    while(scanf("%c",&ch) == 1) 
//    //可以改成" %c",在百分号之前加空格，代表跳过下一个字符前的所有空白字符
//    {
//       if((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
//          printf("%c is an alphabet\n",ch);
//       else
//          printf("%c is not an alphabet\n",ch);
//       getchar();//吃掉/n
//    }
//    return 0;
// }

// #include <ctype.h>
// int main()
// {
//    char ch = 0;
//    while(scanf(" %c",&ch) == 1) 
//    {
//       if(isalpha(ch))
//          printf("%c is an alphabet\n",ch);
//       else
//          printf("%c is not an alphabet\n",ch);
//    }
//    return 0;
// }





// //找最高分
// int main()
// {
//    int i = 0;
//    int max = 0;
//    int n = 0;
//    for(i = 0;i < 3;i++)
//    {
//       scanf("%d",&n);
//       if(n > max)
//          max = n;
//    }
//    printf("%d\n",max);
//    return 0;
// }




//变种水仙花
//把任意的数字从中间拆分成两个数字，若所有拆分后的乘积之和等于本身，即为lily number
//例如
//655 = 6*55 + 65*5
//1461 = 1*641 + 14*61 + 146*1
//求出5位数中所有的lily number
// int main()
// {
//    int i = 0;
//    // for(i = 100;i <= 999;i++)
//    // {
//    //    if(i == ((i/100)*(i%100)+(i/10)*(i%10)))
//    //       printf("%d ",i);
//    // }
//    // for(i = 1000;i <= 9999;i++)
//    // {
//    //    if(i == ((i/1000)*(i%1000)+(i/100)*(i%100)+(i/10)*(i%10)))
//    //       printf("%d ",i);
//    // }
//    for(i = 10000;i <= 99999;i++)
//    {
//       if(i == ((i/10000)*(i%10000)+(i/1000)*(i%1000)+(i/100)*(i%100)+(i/10)*(i%10)))
//          printf("%d ",i);
//    }
//    return 0;
// }

//自己写的是暴力求解，鹏哥写法
#include <math.h>
int main()
{
   int i = 0;
   for(i = 10000;i <= 99999;i++)
   {
      int j = 0;
      int sum = 0;//sum对于每个i来说 用完之后要清零重新开始计算
      for(j = 1;j <= 4;j++)
      {
         int k = (int)pow(10,j);//pow返回类型为double
         sum += (i/k)*(i%k);
      }
      if(i == sum)
         printf("%d ",i);
   }
   return 0;
}